package middleware

import (
	ctl "hello/controller"
	Pkg "hello/pkg"
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
)

func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		//客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI这里假设Token放在Header的Authorization中，并使用Bearer开头//这里的具体实现方式要依据你的实际业务情况决定
		authHeader := c.Request.Header.Get("Authorization")
		if authHeader == "" {
			ctl.RespnseErr(c, ctl.CodeInvalidLogin)
			c.Abort()
			return
		}

		// 按空格分割
		parts := strings.SplitN(authHeader, "", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			ctl.RespnseErr(c, ctl.CodeInvalidToken)
			c.Abort()
			return
		}

		//parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
		mc, err := Pkg.ParseToken(parts[1])
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": 2005,
				"msg":  "无效的Token",
			})

			c.Abort()
			return
		}

		//将当前请求的userId信息保存到请求的上下文c上
		c.Set(ctl.ContextUserIdKey, mc.UserId)

		c.Next() //后续的处理请求函数可以用c.Get(ContextUserIdKey)来获取当前请求的用户信息
	}
}
